/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.Cliente;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletResponse;

/**
 * Rappresenta i dati di un impiegato e permette di dialogare con il DB.
 * 
 * @author Simone Zennaro
 * @version 1.00
 */
public class ClienteDatabase {

	

	/**
	 * Connessione al database
	 */
	private final Connection con;

	/**
	 * L'impiegato da creare
	 */
	private final Cliente cliente;

	/**
	 * Inizializza la classe per salvare un cliente nel DB o estrerne i dati
	 * 
	 * @param con
	 *            connessione al database.
	 * @param cliente
	 *            il cliente da creare.
	 */
	public ClienteDatabase(Connection con, Cliente cliente) {
		this.con = con;
		this.cliente = cliente;
	}


	/**
	 * Crea un nuovo cliente nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void createCliente() throws SQLException {

		//Istruzione per il database.
		String STATEMENT = "INSERT INTO cliente (isPrivato," +
				"cognome,nome,cf, piva, indirizzo, cap, citta,provincia, " +
				"stato,tel,mail,password,confermato) VALUES " +
				"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT);
			pstmt.setBoolean(1, cliente.getIsPrivato());
			pstmt.setString(2, cliente.getCognome());
			pstmt.setString(3, cliente.getNome());
			pstmt.setString(4, cliente.getCf());
			pstmt.setString(5, cliente.getPi());
			pstmt.setString(6, cliente.getIndirizzo());
			pstmt.setString(7, cliente.getCap());
			pstmt.setString(8, cliente.getCitta());
			pstmt.setString(9, cliente.getProvincia());
			pstmt.setString(10, cliente.getStato());
			pstmt.setString(11, cliente.getTelefono());
			pstmt.setString(12, cliente.getEmail());
			pstmt.setString(13, cliente.getPassword());
			pstmt.setBoolean(14, cliente.getConfermato());
			

			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
	
	/**
	 * Modifica un cliente nel DB
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void editCliente() throws SQLException {

		//Istruzione per il database.
		String STATEMENT = "UPDATE cliente " +
				"SET isPrivato=?, cognome=?, nome=?, cf=?, piva=?, indirizzo =?, cap=?, citta=?, provincia=?, " +
				"stato=?, tel=?, password=? WHERE " +
				"mail=?";
		
		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT);
			pstmt.setBoolean(1, cliente.getIsPrivato());
			pstmt.setString(2, cliente.getCognome());
			pstmt.setString(3, cliente.getNome());
			pstmt.setString(4, cliente.getCf());
			pstmt.setString(5, cliente.getPi());
			pstmt.setString(6, cliente.getIndirizzo());
			pstmt.setString(7, cliente.getCap());
			pstmt.setString(8, cliente.getCitta());
			pstmt.setString(9, cliente.getProvincia());
			pstmt.setString(10, cliente.getStato());
			pstmt.setString(11, cliente.getTelefono());
			pstmt.setString(12, cliente.getPassword());
			pstmt.setString(13, cliente.getEmail());
			
			pstmt.executeUpdate();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
	
	/**
	 *Verifica se esiste un utente attivo con le credenziali corrette
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public boolean existsCliente() throws SQLException {
		//Istruzione per il database.
	    String STATEMENT = "SELECT * FROM cliente "+
				"WHERE mail=? and password=? and confermato=true";
		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT);
			pstmt.setString(1, cliente.getEmail());
			pstmt.setString(2, cliente.getPassword());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()){
				return true;
			}
			return false;

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
		
	}
	/**
	 *Estrae tutti i dati del cliente dal DB
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public Cliente getCliente() throws SQLException {
		//Istruzione per il database.
	    String STATEMENT = "SELECT * FROM cliente "+
				"WHERE mail=?";
		PreparedStatement pstmt = null;
		Cliente client=null;
		try {
			pstmt = con.prepareStatement(STATEMENT);
			pstmt.setString(1, this.cliente.getEmail());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()){
				client=new Cliente(rs.getBoolean("isprivato"),rs.getString("cognome"),
									rs.getString("nome"),rs.getString("cf"),
									rs.getString("piva"),rs.getString("indirizzo"),
									rs.getString("cap"),rs.getString("citta"),
									rs.getString("provincia"),rs.getString("stato"),
									rs.getString("tel"),rs.getString("mail"),
									rs.getString("password"),rs.getBoolean("confermato"));
			}
			

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
		return client;
		
	}
	
	
}
